/**
 * copyright (c) 2017-2023 厦门风领科技有限公司
 * https://www.fengling.cn/
 * 
 * 资源管理
 * zengbinsi
 * 2018-09-07
 * 2023-10-24 17:40:15
 */




import * as cc from "cc";
export class GGResource {

    private static getResInfo(filePath: string) {
        return filePath.split(':');
    }

    /**
     * 加载bundle
     * @param bundleName bundle名称
     */
    static loadBundle(bundleName: string, version?: string): Promise<cc.AssetManager.Bundle> {
        return new Promise((s, f)=>{
            cc.assetManager.loadBundle(bundleName, {version}, (err, res)=>{
                err ? f(err) : s(res);
            });
        });
    }

    /**
     * 加载bundle中的资源
     * @param filePath 文件路径，格式： bundleName:filePath
     * @param cls 资源类型
     */
    static load(filePath: string, cls: typeof cc.Asset): Promise<cc.Asset> {
        return new Promise(async(s, f)=>{
            const resInfo = GGResource.getResInfo(filePath);
            try {
                const bundle = await GGResource.loadBundle(resInfo[0]);
                bundle.load(resInfo[1], cls, (err, res)=>{
                    err ? f(err) : s(res);
                });
            } catch (error) {
                f(error);
            }
        });
    }

    /**
     * 加载本地resources资源
     * @param path 资源目录基于resources目录
     * @param assetType 资源类型
     */
    static loadRes(path: string, assetType: typeof cc.Asset) {
        return new Promise((resolve, reject) => {
            cc.resources.load(path, assetType, (err, res) => {
                if (err) {
                    return reject(err);
                }

                return resolve(res);
            });
        });
    }

    /**
     * 加载国际化资源
     * @param path 资源目录基于resources目录
     * @param assetType 资源类型
     */
    static async loadI18nRes(path: string, assetType: typeof cc.Asset) {
        let result;

        try {
            result = await GGResource.loadRes(`i18n/${cc.sys.language}/${path}`, assetType);
        } catch (error) {
            try {
                result = await GGResource.loadRes(path, assetType);
            } catch (error) {
                throw error;
            }
        }

        return result;
    }

    /**
     * 加载远程图片
     * @param url 远程图片URL地址
     * @param imgType 图片格式（png | jpg | jpeg）
     */
    static loadRemoteImage(url: string, imgType: string = 'png') {
        return new Promise((resolve, reject) => {
            // cc.assetManager.loadRemote({ url, type: imgType }, (err, res: cc.SpriteFrame) => {
            cc.assetManager.loadRemote(`${url}+${imgType}`, (err, res: cc.SpriteFrame) => {
                if (err) {
                    return reject(err);
                }

                return resolve(res);
            });
        });
    }

    /**
     * 释放动态加载的资源
     * @param asset 
     */
    static releaseAsset(asset: cc.Asset): void {
        cc.assetManager.releaseAsset(asset);
    }
}
